package com.guojiang.guoaicodemother.ai;

import com.guojiang.guoaicodemother.ai.model.HtmlCodeResult;
import com.guojiang.guoaicodemother.ai.model.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

public interface AiCodeGeneratorService {

    /**
     * 生成 HTML 代码
     *
     * @param userMessage 用户提示词
     * @return
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    HtmlCodeResult generateHTMLCode(@UserMessage String userMessage);

    /**
     * 生成多文件代码
     *
     * @param userMessage 用户提示词
     * @return
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(@UserMessage String userMessage);

    /**
     * 生成 HTML 代码，流式输出
     *
     * @param userMessage 用户提示词
     * @return Flux 数据流
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    Flux<String> generateHTMLCodeStreaming(@UserMessage String userMessage);

    /**
     * 生成多文件代码，流式输出
     *
     * @param userMessage 用户提示词
     * @return Flux 数据流
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStreaming(@UserMessage String userMessage);

    /**
     * 生成 Vue 项目工程代码，流式输出
     *
     * @param appId       应用 ID（作为工具类参数使用 @ToolMemoryId 传入）
     * @param userMessage 用户提示词
     * @return Flux 数据流
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt.txt")
    TokenStream generateVueProjectCodeStreaming(@MemoryId Long appId, @UserMessage String userMessage);
}
